分析KiTrap03, CommonDisPatchException, KiDispatchException, KiUserExceptionDispatcher
  • KiTrap03:
  • (1)处理int3异常的函数为KITrap03
  • (2)在开始异常处理之初,先构造TRAP_FRAME陷阱帧结构,陷阱帧是指一个结构体,用来保存系统调用、中断、异常发生时的寄存器现场,方便以后回到用户空间 / 回到中断处时,回复那些寄存器的值,继续执行
  • (3)注意到KiTrap03实际上调用了CommonDispatchException
  • CommonDisPatchException:
  • (1)判断是用户异常还是内核异常使用的是CS段寄存器的最后两位
  • (2)构件了一个异常记录的结构
  • (3)之后实际上调用了KiDispatchException来处理异常
  • KiDispatchException:
  • (1)该函数用于分发异常,根据异常所产生的模式找到异常的函数
  • (2)如果异常发生在内核模式,函数会直接调用一个异常处理函数直接处理异常
  • (3)如果异常发生在用户模式,则函数会将异常记录、异常栈帧 和 陷阱栈帧拷贝到用户模式的线程的栈(这些信息在用户态可以被修改,被修改会重新设置到线程环境上),随后函数会进入到用户态,到了用户态之后会被专门的函数去处理异常。
  • KiUserExceptionDispatcher:
  • (1)函数第一个参数为异常类型,第二个参数为产生异常时的上下文记录
  • (2)KiUserExceptionDispatcher 的核心是对 RtlDispatchException 的调用。这拉开了搜索已注册的异常处理程序的序幕。如果某个处理程序处理这个异常并继续执行,那么对 RtlDispatchException 的调用就不会返回。如果它返回了,只有两种可能:或者调用了NtContinue以便让进程继续执行,或者产生了新的异常。如果是这样,那异常就不能再继续处理了,必须终止进程。
文章作者: yusakul
文章链接: http://yoursite.com/2018/06/21/分析KiTrap03, CommonDisPatchException, KiDispatchException, KiUserExceptionDispatcher/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 梁言